package j.framework.base.service;

import j.data.ActionResult;
import j.framework.core.LoginUser;
import j.framework.core.ServiceContext;
import j.framework.core.WebRequestMetadata;
import j.framework.core.entity.Entity;
import j.framework.query.core.QueryContext;
import j.framework.query.core.QueryMetadata;
import j.framework.query.core.QueryResult;

import java.util.List;
import java.util.Map;

/**
 * 系统级的一些方法，主要为集成的框架服务
 * User: jason
 * Date: 2015/3/31 13:03
 */
public interface SystemService {
    /**
     * 根据查询key或查询ID获取自定义查询元数据
     * @param queryKey
     * @return
     */
    QueryMetadata getQueryMetadata(String queryKey);

    /**
     * 获取定义请求的元数据
     * @param requestId
     * @return
     */
    WebRequestMetadata getWebRequestMetadata(String requestId);

    /**
     * 查询，根据自定义查询元数据进行查询
     * @param qc
     * @return
     */
    QueryResult queryData(QueryContext qc);
    /**
     * 查询，根据自定义查询元数据进行查询
     * @param qc
     * @return
     */
    QueryResult queryData(QueryContext qc, boolean noPaging);

    /**
     * 获取实体元数据配置
     * @param eid
     * @return
     */
    Entity getEntity(String eid);

    /**
     * 根据用户输入的参数来、实体的配置，获取此实体的相关数据
     * @param e
     * @param parameters
     * @return
     */
    Map<String,Object> findEntity(Entity e, Map<String, String> parameters);

    /**
     * 增加实体数据到所配置的数据表中
     * @param user
     * @param e
     * @param parameters
     * @param ar
     */
    Map<String,Object> insertEntity(LoginUser user, Entity e, Map<String, String> parameters, ActionResult ar);

    /**
     * 更新实体数据
     * @param user
     * @param e
     * @param parameters
     * @param ar
     */
    Map<String,Object> updateEntity(LoginUser user, Entity e, Map<String, String> parameters, ActionResult ar);

    /**
     * 删除实体数据
     * @param user
     * @param e
     * @param parameters
     * @param ar
     */
    void deleteEntity(LoginUser user, Entity e, Map<String, String> parameters, ActionResult ar);

    /**
     * 根据“富文本ID”获取内容
     * @param richTextId
     * @return
     */
    String getRichContentById(String richTextId);

    /**
     * 获取富文本内容
     * 必须指定富文本主键ID
     * @param serviceContext
     * @return
     */
    Map<String,Object> getRichContent(ServiceContext serviceContext);

    /**
     * 保存富文本内容，richTextId及富文本内容两个参数是必须的
     * 同时需要指定业务表名称及业务表的主键字段名及业务表的主键值三个参数，根据这三个参数将富文本主键回填到业务表上
     * 保存后，返回明文主键
     * @param serviceContext
     */
    String saveRichContent(ServiceContext serviceContext);

    /**
     * 获取年份列表，仅获取前五六及今年、明年
     * @param serviceContext
     * @return
     */
    List<Map<String,Object>> getYears(ServiceContext serviceContext);
}
